<?php
declare(strict_types=1);
namespace app\common\model;
use think\Model;
use think\Validate;
use app\common\model\Debug;
use app\common\model\ErrLog;

class Base extends Model
{
	// 模型类公用验证器 [false-关闭验证（默认） Object-启用验证时，存储验证器对象]
	protected $Validate = false;


	/**
	 * 模型初始化
	 */
	protected static function init()
	{

	}


	/**
	 * 开启模型验证（使用框架验证器校验数据）
	 * @param $namespace 验证器命名空间
	 *   不手动指定时，尝试自动加载与模型同名的验证器（默认）；若设置为false，则关闭模型验证
	 * @return Object $this 模型类对象自身
	 */
	public function validate($namespace=true)
	{
		if( is_bool($namespace) )
		{
			switch($namespace)
			{
				// 关闭模型验证
				case false:
					$this->Validate = false;
					break;
				// 打开模型验证（自动）
				case true:
					// 获取当前模型类名（不含命名空间路径）
					$class_name = (new \ReflectionClass($this))->getShortName();
					$namespace = "\\app\\common\\model\\validate\\{$class_name}";
					$this->Validate = new $namespace;
					break;
			}
		}
		else
		{
			// 打开模型验证（手动）
			$this->Validate = new $namespace;
		}

		return $this;
	}


	/**
	 * 保存日志到数据库
	 * @param Int $level 日志等级 [1-错误 2-调试信息（默认）]
	 * @param Mixed $custom_data 自定义数据
	 * @return Bool
	 */
	static public function saveLog(int $level=2, $custom_data='')
	{
		$stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2);
		$line = $stack[0]['line'];
		$caller = $stack[1]['class'];
		$function = $stack[1]['function'];

		$host = Request()->host();
		$url = Request()->url();

		// 处理自定义数据
		$custom_data = [
			'custom_data' => $custom_data
		];

		// 组装数据
		$timestamp = time();
		$data = [
			'date' => date('Y-m-d H:i:s', $timestamp),
			'ip' => Request()->ip(),
			'url' => "{$host}{$url}",
			'path' => "{$caller}\\{$function}",
			'line' => $line,
			'request_data' => json_encode((array)Request(), JSON_UNESCAPED_UNICODE),
			'get_data' => json_encode(input('get.'), JSON_UNESCAPED_UNICODE),
			'post_data' => json_encode(input('post.'), JSON_UNESCAPED_UNICODE),
			'custom_data' => json_encode($custom_data, JSON_UNESCAPED_UNICODE),
			'create_time' => $timestamp
		];

		// 根据日志等级，选择存储位置
		switch($level)
		{
			case 1:
				$log_table = new ErrLog();
				break;
			case 2:
				$log_table = new Debug();
				break;
		}

		$table_suffix = date('_Y', $timestamp);
		$save_log = $log_table
			->setSuffix($table_suffix)
			->save($data);
		return $save_log ? true : false;
	}


}
